package Concurrent;

import java.util.Collections;
import java.util.concurrent.locks.ReentrantLock;

public class Reentrantlock {
    public static void main(String[] args) {
        /**  synchronized 使用时不需要手动释放锁. ReentrantLock 使用时需要手动释放. 使用起来更灵活
             synchronized 在申请锁失败时, 会死等. ReentrantLock 可以通过 trylock 的方式等待一段时
             间就放弃.
             synchronized 是非公平锁, ReentrantLock 默认是非公平锁. 可以通过构造方法传入一个
             true 开启公平锁模式.
             synchronized 是通过 Object 的 wait / notify 实现等待-唤醒. 每次唤醒的是一个随机等待的
             线程. ReentrantLock 搭配 Condition 类实现等待-唤醒, 可以更精确控制唤醒某个指定的线程
         */
        ReentrantLock reentrantLock = new ReentrantLock();
        reentrantLock.lock();
        //如果在解锁之前有很多条件判断语句,并且条件成立之后会直接return 或者抛了异常, 那么就执行不到这个unlock,
        //如果要解锁,还要再加上unlock,或者使用try catch 把unlock放到finally里 很容易忘记
        reentrantLock.unlock();
        //但是reentrantlock 也是优势 : 1. 提供了公平锁在构造里面加上true (是先来后到的)
        //2.提供了更加灵活的等待方式trylock无参数版本,能加锁就加锁,加不上就放弃,还可以指定超时时间加不上就等待一会,如果到了时间也没加上,就不加
        boolean flg = reentrantLock.tryLock();
    }
}
